home *** CD-ROM | disk | FTP | other *** search
/ Whiteline: delta / whiteline CD Series - delta.iso / document / hypertxt / xfsl / source / purec / fix31 / fix31.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-11-25  |  5.5 KB  |  174 lines

  1. /*  @(#)fix31.c, Dirk Haun, Mai/Juli 1995
  2.  *  @(#)einfaches xFSL-Testprogramm für fix31-Modus
  3.  *
  4.  *  Das Programm zeigt, wie man einen Fontselektor über die xFSL-Schnittstelle
  5.  *  aufruft. Die übergebene xFSL_PAR-Struktur dient dabei der Ein- und Ausgabe.
  6.  *
  7.  *  Die benötigten Informationen über den ausgewählten Font stehen hinterher in
  8.  *  xpar.font, d.h. in der PFONTINFO-Struktur innerhalb der xFSL_PAR-Struktur.
  9.  *
  10.  *  Der Fontselektor wird hierbei im fix31-Modus aufgerufen, sofern er dies
  11.  *  unterstützt.
  12.  *
  13.  *  Da es sich nur um ein Demo-Programm handelt, das mit dem ausgewählten Font
  14.  *  nichts weiter anfängt, wird auf das Öffnen einer VDI-Workstation und das
  15.  *  Nachladen der Fonts mit vst_load_fonts() verzichtet.
  16.  *
  17.  *  Bugs: Der Aufruf der Hilfe (ST-Guide) funktioniert so nicht mit Memory
  18.  *        Protection.
  19.  */
  20.  
  21. #include <stdio.h>
  22. #include <aes.h>
  23. #include <vdi.h>
  24. #include <string.h>
  25. #include <xfsl.h>
  26.  
  27. #ifndef FALSE
  28. # define FALSE (0)
  29. # define TRUE  (1)
  30. #endif
  31.  
  32. #define VA_START 0x4711
  33.  
  34. extern int get_cookie(long cookie,long *val);
  35. extern fix31 pt2fix(int pt);
  36. extern int fix2pt(fix31 f);
  37.  
  38. void error(int e)
  39. {
  40.  switch(e)
  41.  {
  42.   case xFS_PARERROR   : form_alert(1,"[2][Fehler in den übergebenen|Parametern!][Abbruch]");
  43.                         break;
  44.   case xFS_LOADERROR  : form_alert(1,"[2][Fehler beim Nachladen|von XFSL.OVL!][Abbruch]");
  45.                         break;
  46.   case xFS_RES_ERROR  : form_alert(1,"[2][Auflösung zu gering!][Abbruch]");
  47.                         break;
  48.   case xFS_NO_HANDLE  : form_alert(1,"[2][Kein Handle frei!][Abbruch]");
  49.                         break;
  50.   case xFS_NO_WINDOW  : form_alert(1,"[2][Kein Fenster frei!][Abbruch]");
  51.                         break;
  52.   case xFS_NO_FONTS   : form_alert(1,"[2][Keine Fonts geladen!][Abbruch]");
  53.                         break;
  54.   case xFS_NO_FONTSIZE: form_alert(1,"[2][Fontgröße konnte nicht|identifiziert werden!][Abbruch]");
  55.                         break;
  56.   case xFS_ACTIVE     : form_alert(1,"[2][Fontselektor ist bereits aktiv!][Abbruch]");
  57.                         break;
  58.   case xFS_ERROR      : form_alert(1,"[2][Speichermangel!][Abbruch]");
  59.                         break;
  60.   default             : if(e<0) form_error(-31-e); /* Gemdos-Fehlermeldung */
  61.  }
  62. }
  63.  
  64. void appl_pwrite(int apid,...)
  65. {
  66.  int i, msg[8];
  67.  va_list pp;
  68.  
  69.  va_start(pp,apid);
  70.  for(i=0;i<8;i++) msg[i]=va_arg(pp,int);
  71.  appl_write(apid,16,msg);
  72.  va_end(pp);
  73. }
  74.  
  75. void main(void)
  76. {
  77.  int ret, xhandle, stg, gl_apid, again, vork;
  78.  char fontname[40], alert[128], transfer[256];
  79.  long features, nachk;
  80.  char *cp;
  81.  EVENT ev;
  82.  xFSL *xfsl;
  83.  xFSL_PAR xpar;
  84.  PFONTINFO pfont;
  85.  
  86.  gl_apid=appl_init();
  87.  if(get_cookie('xFSL',(long*)&xfsl))
  88.  {
  89.   features=xfsl->xfsl_info();
  90.   if((features&XF_FIX31)==0)
  91.     form_alert(1,"[1][Der xFSL-Selektor unterstützt |keine fix31-Angaben! ][ Schade ]");
  92.  
  93.  
  94.   /*  Vorbereitungen
  95.    */
  96.   memset(&xpar,0,sizeof(xFSL_PAR));         /* Strukturen "ausnullen" */
  97.   memset(&pfont,0,sizeof(PFONTINFO));
  98.  
  99.   xpar.par_size=(int)sizeof(xFSL_PAR);      /* Strukturgrößen eintragen */
  100.   xpar.pfi_size=(int)sizeof(PFONTINFO);
  101.   xpar.font=&pfont;                         /* Zeiger auf Fontinfo eintragen */
  102.  
  103.   xpar.control|=CC_WINDOW;                  /* xFSL als Fenster */
  104.   if(features&XF_FIX31) xpar.control|=CC_FIX31;
  105.   xpar.headline="Wählen Sie einen Font!";   /* Überschrift */
  106.   xpar.example="Jetzt aber fix!";           /* Beispieltext */
  107.   xpar.helptext="HILFE";                    /* Text für Hilfe-Button */
  108.   xpar.fontflags=FF_VEKTOR;                 /* nur Vektorfonts zur Auswahl stellen */
  109.   fontname[0]='\0';
  110.   xpar.font->fontname=fontname;
  111.   xpar.font->fontcol=BLACK;
  112.  
  113.  
  114.   /*  Jetzt kann's losgehen
  115.    */
  116.   do
  117.   {
  118.    again=FALSE;
  119.  
  120.    xhandle=xfsl->xfsl_init(0,&xpar);        /* Dialog darstellen, Handle zurückgeben */
  121.  
  122.    if(xhandle==xFS_NO_WINDOW) /* Kein Fenster frei? Dann als modaler Dialog */
  123.    {
  124.     xpar.control&=~CC_WINDOW;
  125.     xhandle=xfsl->xfsl_init(0,&xpar);
  126.    }
  127.  
  128.    if(xhandle>=0)                           /* gültiges Handle? */
  129.    {
  130.     do
  131.     {
  132.      ev.ev_mflags=0;
  133.      ret=xfsl->xfsl_event(xhandle,&ev);
  134.      if(ret==xFS_HELP && xpar.helpinfo)     /* Hilfe aufrufen */
  135.      {
  136.       stg=appl_find("ST-GUIDE");
  137.       if(stg>0)
  138.       {
  139.        cp=strchr(xpar.helpinfo,',');
  140.        if(cp)
  141.        {
  142.         strcpy(transfer,"*:\\");
  143.         strncat(transfer,xpar.helpinfo,(int)(cp-xpar.helpinfo));
  144.         strcat(transfer,".hyp ");
  145.         strcat(transfer,cp+1);
  146.         appl_pwrite(stg,VA_START,gl_apid,0,transfer,0,0,0);
  147.        }
  148.       }
  149.       else form_alert(1,"[2][Keine Hilfe verfügbar! ][ Pech ]");
  150.      }
  151.     }
  152.     while(ret!=xFS_OK && ret!=xFS_STOP);    /* bis "OK" oder "Abbruch" gewählt */
  153.     xfsl->xfsl_exit(xhandle);               /* Dialog abmelden */
  154.     if(ret<0) error(ret);
  155.     else if(ret==xFS_OK)
  156.     {
  157.      vork=(int)(xpar.font->fontsize.size31>>16); /* Vorkomma-Anteil */
  158.      nachk=(xpar.font->fontsize.size31&0xffff);  /* Nachkomma-Anteil */
  159.      nachk*=100; nachk+=49; nachk/=65536L;       /* ... auf zwei Stellen runden */
  160.  
  161.      sprintf(alert,"[1][Ausgewählt wurde der|Font mit ID %u|in der Größe %d.%d pt|(gerundet: %d pt).][ Nochmal | Abbruch ]"
  162.                   ,xpar.font->fontid,vork,(int)nachk,fix2pt(xpar.font->fontsize.size31));
  163.      if(form_alert(1,alert)==1) again=TRUE;
  164.     }
  165.    }
  166.    else error(xhandle);
  167.   }
  168.   while(again);
  169.  
  170.  }
  171.  else form_alert(1,"[2][Sorry, kein xFSL-Cookie vorhanden. ][ Abbruch ]");
  172.  appl_exit();
  173. }
  174.